<?php
/**
 * Smarty plugin
 * @package Smarty
 * @subpackage plugins
 */

/**
 * Include the {@link shared.make_timestamp.php} plugin
 */
require_once $smarty->_get_plugin_filepath('shared', 'make_timestamp');
/**
 * Smarty date_format modifier plugin
 *
 * Type:     modifier<br>
 * Name:     date_format<br>
 * Purpose:  format datestamps via strftime<br>
 * Input:<br>
 *         - string: input date string
 *         - format: strftime format for output
 *         - default_date: default date if $string is empty
 * @link http://smarty.php.net/manual/en/language.modifier.date.format.php
 *          date_format (Smarty online manual)
 * @author   Monte Ohrt <monte at ohrt dot com>
 * @param string
 * @param string
 * @param string
 * @return string|void
 * @uses smarty_make_timestamp()
 */
function smarty_modifier_datef( $string, $format = null, $default_date = null )
{
	$__noday = false;
	if($string != '') {
		if( strpos( $string, '-00' ) !== false )
		{
			$string = str_replace( '-00', '-01', $string );
			$__noday = true;
		}
		$timestamp = smarty_make_timestamp( $string );
	} elseif( !is_null( $default_date ) && $default_date != '' ) {
		$timestamp = smarty_make_timestamp( $default_date );
	} else {
		return;
	}
	
	if($format == 'age')
	{
		$birthdate = strtotime($string);
		$current = time();
		$period = $current - $birthdate;
		$age_in_years = floor($period / (365*24*60*60));
		return $age_in_years;
	}
	
	if($format == 'd')
		$format = '%d %B %Y';
	if($format == 'dt')
		$format = '%d %B %Y, %H:%M';
	
	if( is_null( $format ) || $format == 'diff' || $format == 'diffp' || $format == 'inaccuracyDiff' )
	{
		if( is_null( $format ) ) $format = 'inaccuracyDiff';
		
		$diff = time()-$timestamp;
		switch( $format )
		{
		case 'inaccuracyDiff':
		$diffclass =
			    $diff < 1*60*60	? 0
			: ( $diff < 6*60*60	? 1
			: ( $diff < 18*60*60	? 2
			: ( $diff < 40*60*60	? 3
			: ( $diff < 7*24*60*60	? 4
			: ( $diff < 11*24*60*60	? 5
			: ( $diff < 19*24*60*60	? 6
			: ( $diff < 30*24*60*60	? 7
//			: ( $diff < 50*24*60*60	? 8
			: null ))))))); //);
		$diffstring = array(
			0 => "только что",	// less than hour
			1 => "недавно",		// 1-6 hours
			2 => "сегодня",		// 6-18 hours
			3 => "вчера",		// 18-40 hours
			4 => "недавно",		// 40-168 hours (~2-7 days)
			5 => "неделю назад",	// 7-11 days
			6 => "полмесяца назад",	// 11-19 days
			7 => "месяц назад",	// 19-30 days
			8 => "пару месяцев назад", // 30-50 days
			);
		
		if( !is_null( $diffclass ) && isset( $diffstring[ $diffclass ] ) )
			return $diffstring[ $diffclass ];
		
		break;
		case 'diff':
		case 'diffp':
		$diffclass =
			    $diff < 1*60	? 0 // less than minute
			: ( $diff < 90*60	? 1 // 1-90 minutes 
			: ( $diff < 40*3600	? 2 // 1.5-40 hours
			: ( $diff < 15*86400	? 3 // 40 hours-15 days (~2-14 days)
			: ( $diff < 62*86400	? 4 // 15-62 days (~2-9 weeks)
			: ( $diff < 36*7*86400	? 5 // 9-36 weeks (2-9 months)
//			: ( $diff < 50*60*60	? 8
			: null )))));
		
		if( is_null( $diffclass ) )
			break;
		if( $diffclass === 0 )
			return 'только что';
		
		$divider = array( 1, 60, 3600, 86400, 604800, 2592000 );
		$text = array(
			1 => ( $format == 'diff' ) ? "минута минуты минут" : "минуту минуты минут", // ж.р.
			2 => "час часа часов",
			3 => "день дня дней",
			4 => ( $format == 'diff' ) ? "неделя недели недель" : "неделю недели недель", // ж.р.
			5 => "месяц месяца месяцев",
			);
		$text1 = array( '', 'на прошлой минуте', 'в прошлом часу', 'вчера', 'на той неделе', 'в прошлом месяце' );
		
		$value = round( $diff / $divider[$diffclass] );
		
		if( $value == 1 ) return $text1[$diffclass];
		return sprintf( '%d %s', $value, _::plural( explode( ' ', $text[$diffclass] ), $value ) ).' назад';
		
		}
		
		$format = trim( ($__noday?'%B':'%e %B').(date('Y',$timestamp)!==date('Y')?($__noday?'\'%y':' %Y'):'') );
		//$format = '%d %B %Y, %H:%M';
	}
	
	// for win
	if( DIRECTORY_SEPARATOR == '\\' ) {
		$_win_from = array('%D',       '%h', '%n', '%r',          '%R',    '%t', '%T');
		$_win_to   = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S');
		if (strpos($format, '%e') !== false) {
			$_win_from[] = '%e';
			$_win_to[]   = sprintf('%\' 2d', date('j', $timestamp));
		}
		if (strpos($format, '%l') !== false) {
			$_win_from[] = '%l';
			$_win_to[]   = sprintf('%\' 2d', date('h', $timestamp));
		}
		$format = str_replace($_win_from, $_win_to, $format);
	}
	
	$out = strftime( $format, $timestamp );

	$monthconv = array(
		'Январь' => 'января',
		'Февраль' => 'февраля',
		'Март' => 'марта',
		'Апрель' => 'апреля',
		'Май' => 'мая',
		'Июнь' => 'июня',
		'Июль' => 'июля',
		'Август' => 'августа',
		'Сентябрь' => 'сентября',
		'Октябрь' => 'октября',
		'Ноябрь' => 'ноября',
		'Декабрь' => 'декабря',
		);
	if( strpos( $format, '%e' ) !== false || strpos( $format, '%d' ) !== false ) {
		$out = str_replace( array_keys( $monthconv ), array_values( $monthconv ), $out );
	} else {
		$out = str_replace( array_values( $monthconv ), array_keys( $monthconv ), $out );
	}
	$out = mb_strtoupper(mb_substr($out,0,1)) . mb_strtolower(mb_substr($out,1));
	
	return $out;
}

?>